﻿package  {
	import flash.display.Sprite;
	import flash.utils.Timer;
	import flash.events.TimerEvent;
	import flash.events.Event;
	import flash.events.MouseEvent;
	import flash.events.KeyboardEvent;
	import flash.display.Stage;
	import flash.display.StageDisplayState;


	public class game extends Sprite {

		// Declarar todos los elementos
		var mapa:map=new map();
		var enemigos:Array = new Array();
		var s_exit:sound;
		
		var currentStage; // El nivel entre 1 y 4 en el que estamos parados
		var currentRonda; // La ronda por la que vamos de haber terminado toddys los 4 niveles y empezar de nuevo.
		// En cada ronda nueva el hp se va reduciendo !
		var cred:creditos;
		var cr:Boolean=false;
		var intro:s_intro;
		var flag:int;
		private var Hero:hero;
		var cong:congrats=new congrats();
		var cg:Boolean;
		
		var hud:HeartHud
		
		public function game() {
			
			currentRonda= 0; // Estamos en la ronda inicial 
			currentStage= 1; // Estamos en el primer nivel, recien arrancando el juego
			intro=new s_intro();
			flag=0;
			cg=false;
			
			addChild(intro);
			
			
			// constructor code
			//agregar los listener y el comando full screen
			stage.displayState=StageDisplayState.FULL_SCREEN;
			addEventListener(Event.ENTER_FRAME,update);
			stage.addEventListener(KeyboardEvent.KEY_DOWN, key_down);
			stage.addEventListener(KeyboardEvent.KEY_UP, key_up);
			
		}
		
		public function crear_primer(){
			
			addChild(mapa);
			mapa.crear_map(1);
			create_hero(mapa.h_x,mapa.h_y);
			Hero.hp= 3;
			s_exit=new sound("sound/exitportal.mp3",0,0,1);
			createHeartHud();
		
		}
		
		public function createHeartHud() {
			hud= new HeartHud;
			addChild(hud);
			hud.x= 462;
			hud.y= 23.4;
			hud.gotoAndStop(4-Hero.hp);
			
		}
		
		// Hacemos el proceso de cargar un nuevo nivel
		// Llevamos la cuenta de por cual stage 
		public function loadNextLevel() {
			Hero.s_damage.stop();
			Hero.s_jump.stop();
			Hero.s_step.stop();
			removeChild(Hero);
			removeChild(mapa);
			mapa.lvl_sonido.stop();
			currentStage= currentStage+1;
			if (currentStage>4) {
				currentStage= 1;
				currentRonda= currentRonda +1;
				// Si nos pasamos del stage 4 brincamos de ronda
			}
			if (currentRonda > 2) {
				// Si nos pasamos de la ronda 3, ya se acabo el juego !!
				// HACER ALGO AQUI PAL FINAL DEL JUEGO Y NOS VAMOS PAL CO !!
				
				addChild(cong);
				cg=true;
				
				mapa.lvl_sonido.stop();
				
			}
			else{
				
			mapa= new map();
			Hero= new hero;
			addChild(mapa);
			mapa.crear_map(currentStage);
			create_hero(mapa.h_x,mapa.h_y);
			Hero.hp= 3-currentRonda; // Menos hp cada ronda
			}
		}
		
		public function creditos_ya(){
			cred=new creditos();
				addChild(cred);
				
				cr=true;
		}
		
		private function key_down(event:KeyboardEvent){
			
			if(cg){
				creditos_ya();
				cg=false;
				return;
			}
			
			if(flag<2){
				flag++;
				intro.gotoAndStop(2);
				if(flag==2){
					intro.gotoAndStop(3);
					removeChildAt(0);
					//removeChildAt(0);
					crear_primer()
				}
				return;
			}
			Hero.hero_key_down(event);
			//if(event.keyCode==90)loadNextLevel();
		}
		
		private function key_up(event:KeyboardEvent){
			if(flag<2)return;
			Hero.hero_key_up(event);
		}
		
		function update(e:Event):void{
			//update para los objetos
			if(flag<2)return;
			
			Hero.updateHero();
			if(Hero.hp==0){
				Hero.hp= 3-currentRonda;
				Hero.x=mapa.h_x;
				Hero.y=mapa.h_y;
			}
			checkColisionTiles();
			checkColisionSpikes();
			checkColisionMTiles();
			checkColisionFlames();
			
			checkColisionExit();
			if(cr)cred.t_update();
			// Actualizar contenido del HUD
			hud.gotoAndStop(4-Hero.hp);
		}
		
		private function create_hero(start_x:int, start_y:int){
			
			if     	(currentStage==4) 	Hero = new heroOld;
			else if (currentStage==1) 	Hero = new heroBaby;
			else						Hero = new hero;
			
			addChild(Hero);
			Hero.x = start_x;
			Hero.y = start_y;
		}
		/////
		public function checkColisionMTiles(){
			//trace(mapa.mov_tiles.length);
			for(var t:int; t < mapa.mov_tiles.length; t++){
				
				mapa.mov_tiles[t].m_update();
				
				while(mapa.mov_tiles[t].hitTestPoint(Hero.x,Hero.y + Hero.height/2,true)){
					Hero.y -= 1;
					if(Hero.y_speed >= 0){									
						Hero.can_jump = true;
						Hero.number_jumps= 0;
						

					}
				}
				while(mapa.mov_tiles[t].hitTestPoint(Hero.x,Hero.y - Hero.height/2,true)){
					Hero.y += 1;
					Hero.y_speed = Hero.y_speed*-1;
					
				}
				while(mapa.mov_tiles[t].hitTestPoint(Hero.x + Hero.width/2,Hero.y,true)){
					Hero.x -= 1;
					Hero.y_speed = Hero.y_speed*-1;
					//number_jumps= 0;
				}
				while(mapa.mov_tiles[t].hitTestPoint(Hero.x -Hero.width/2,Hero.y,true)){
					Hero.x += 1;
					

					//number_jumps= 0;
				}
			}
		
		}
		
		public function checkColisionTiles() {
			// Chequeo de colision con bloques
			for(var t:int; t < mapa.tiles.length; t++){
				while(mapa.tiles[t].hitTestPoint(Hero.x,Hero.y + Hero.height/2,true)){
					Hero.y -= 1;
					if(Hero.y_speed >= 0){									
						Hero.can_jump = true;
						Hero.number_jumps= 0;
						

					}
				}
				while(mapa.tiles[t].hitTestPoint(Hero.x,Hero.y - Hero.height/2,true)){
					Hero.y += 1;
					Hero.y_speed = Hero.y_speed*-1;
					
				}
				while(mapa.tiles[t].hitTestPoint(Hero.x + Hero.width/2,Hero.y,true)){
					Hero.x -= 1;
					Hero.y_speed = Hero.y_speed*-1;
					//number_jumps= 0;
				}
				while(mapa.tiles[t].hitTestPoint(Hero.x -Hero.width/2,Hero.y,true)){
					Hero.x += 1;
					

					//number_jumps= 0;
				}
			}
		}
		///
		public function checkColisionPowerups() {
			// Chequeo de colision con bloques
			for(var t:int; t < mapa.powerups.length; t++){
				while(mapa.powerups[t].hitTestPoint(Hero.x,Hero.y + Hero.height/2,true)){
					Hero.y -= 1;
					if(Hero.y_speed >= 0){									
						Hero.can_jump = true;
						Hero.number_jumps= 0;
					}
				}
				while(mapa.powerups[t].hitTestPoint(Hero.x,Hero.y - Hero.height/2,true)){
					Hero.y += 1;
					Hero.y_speed = Hero.y_speed*-1;
				}
				while(mapa.powerups[t].hitTestPoint(Hero.x + Hero.width/2,Hero.y,true)){
					Hero.x -= 1;
					Hero.y_speed = Hero.y_speed*-1;
					//number_jumps= 0;
				}
				while(mapa.powerups[t].hitTestPoint(Hero.x -Hero.width/2,Hero.y,true)){
					Hero.x += 1;
					

					//number_jumps= 0;
				}
			}
		}
		///
		public function checkColisionMovilSpikes() {
			// Chequeo de colision con bloques
			for(var t:int; t < mapa.spikes.length; t++){
				while(mapa.spikes[t].hitTestPoint(Hero.x,Hero.y + Hero.height/2,true)){
					Hero.y -= 1;
					if(Hero.y_speed >= 0){									
						Hero.can_jump = true;
						Hero.number_jumps= 0;
						Hero.impactGround();
					}
				}
				while(mapa.spikes[t].hitTestPoint(Hero.x,Hero.y - Hero.height/2,true)){
					Hero.y += 1;
					Hero.y_speed = 0;
					Hero.number_jumps= 0;
					Hero.impactAir();
				}
				while(mapa.spikes[t].hitTestPoint(Hero.x + Hero.width/2,Hero.y,true)){
					Hero.x -= 1;
					Hero.impactAir();
					//number_jumps= 0;
				}
				while(mapa.spikes[t].hitTestPoint(Hero.x -Hero.width/2,Hero.y,true)){
					Hero.x += 1;
					Hero.impactAir();
					//number_jumps= 0;
				}
			}
		}
		///
		public function checkColisionExit() {
				if(mapa.exitDoor.hitTestPoint(Hero.x,Hero.y - Hero.height/2,true)){
				    s_exit.play();
				 	loadNextLevel();
				}
					
				if(mapa.exitDoor.hitTestPoint(Hero.x,Hero.y + Hero.height/2,true)){
				 	 s_exit.play();
					loadNextLevel();
				}
					
				if(mapa.exitDoor.hitTestPoint(Hero.x + Hero.width/2,Hero.y,true)){
				 	 s_exit.play();
					loadNextLevel();
				}
					
				if(mapa.exitDoor.hitTestPoint(Hero.x - Hero.width/2,Hero.y,true)){
				 	 s_exit.play();
					loadNextLevel();
				}
		}
		///
		public function checkColisionFlames() {
			// Chequeo de colision con bloques
			if(Hero.invulnerable<Hero.inv_time)return;
			for(var t:int; t < mapa.flamas.length; t++){
				for(var u:int=mapa.flamas[t].numChildren-1; u>1;u--){
				while(mapa.flamas[t].getChildAt(u).hitTestPoint(Hero.x,Hero.y + Hero.height/2,true)){
					Hero.y-=1;
					if(Hero.y_speed >= 0){									
						    Hero.can_jump = true;
						    Hero.number_jumps= 0;
						//if(Hero.invulnerable<Hero.inv_time)return;
						trace(Hero.y_speed);
						//if (mapa.flames[t].dir=!3)
						if(u!=mapa.flamas[t].numChildren-1)Hero.impactGround();
						
					}
				}
				while(mapa.flamas[t].getChildAt(u).hitTestPoint(Hero.x,Hero.y - Hero.height/2,true)){
					
					    Hero.y += 1;
						
					//if (mapa.flames[t].dir=!1)  
					if(u!=mapa.flamas[t].numChildren-1){Hero.impactAir();}
					else{
						Hero.y_speed = 0;
						Hero.number_jumps= 0;
					}
				}
				while(mapa.flamas[t].getChildAt(u).hitTestPoint(Hero.x + Hero.width/2,Hero.y,true)){
					 Hero.x -= 1;
					//if (mapa.flames[t].dir=!2) 
					if(u!=mapa.flamas[t].numChildren-1)Hero.impactAir();
				//	else Hero.x -= 1;
					//number_jumps= 0;
				}
				while(mapa.flamas[t].getChildAt(u).hitTestPoint(Hero.x -Hero.width/2,Hero.y,true)){
					Hero.x += 1;
					//if (mapa.flames[t].dir=!0) 
					if(u!=mapa.flamas[t].numChildren-1)Hero.impactAir();
				//	else  Hero.x += 1;
					//number_jumps= 0;
				}
				}
			}
		}
		
		///
		public function checkColisionSpikes() {
			// Chequeo de colision con bloques
			for(var t:int; t < mapa.spikes.length; t++){
				while(mapa.spikes[t].hitTestPoint(Hero.x,Hero.y + Hero.height/2,true)){
					Hero.y -= 1;
					if(Hero.y_speed >= 0){									
						Hero.can_jump = true;
						Hero.number_jumps= 0;
						Hero.impactGround();
					}
				}
				while(mapa.spikes[t].hitTestPoint(Hero.x,Hero.y - Hero.height/2,true)){
					Hero.y += 1;
					Hero.y_speed = 0;
					Hero.number_jumps= 0;
					Hero.impactAir();
				}
				while(mapa.spikes[t].hitTestPoint(Hero.x + Hero.width/2,Hero.y,true)){
					Hero.x -= 1;
					Hero.impactAir();
					//number_jumps= 0;
				}
				while(mapa.spikes[t].hitTestPoint(Hero.x -Hero.width/2,Hero.y,true)){
					Hero.x += 1;
					Hero.impactAir();
					//number_jumps= 0;
				}
			}
		}

	}
	
}
